# -*- coding: utf-8 -*-

import requests
from common.logget import logger
from retrying import retry


class HttpRequest:
    """
把get和post封装成为一个类
    """

    def __init__(self):
        self.session = requests.session()  # 创建一个session会话保持cookies

    """
    位置传参 此代码不用写data=None,json=Mone做自动化 根据method自动判断用par还是data,如果加上data=None 那么在写代码的时候传参，还要做 是否是post的判断，然后写data=｛xxx｝进行关键字传参。
    因为是位置参数 所以直接传字典的话 他只会传给params
    """
    @retry(wait_fixed=3000, stop_max_attempt_number=3)  # 超时重试机制
    def request(self, method, url, datas=None, headers=None, **kwargs):
        """
        :param method: 请求方法
        :param url: 请求地址
        :param params: get请求参数
        :param data: 键值对,表单
        :param json: json数据格式
        :param headers: 请求头
        :param kwargs: 不定长参数
        :param parammode:请求参数传入方式 data/json
        :return:
        """
        try:
            # logger.debug(f'开始调用接口:{url},\n参数为:{datas},\n请求方法为：{method}')

            if method.upper() == 'GET':
                return self.session.request(method, url, params=datas, headers=headers, **kwargs)
            # 减少后面代码层面的判断，在请求时提前判断
            elif method == 'POST':  # 大写post是用data传参  form-data格式 请求参数类型为data
                return self.session.request(method, url, data=datas, headers=headers, **kwargs)
            elif method == 'post':  # 小写post是用json传参  application/json
                return self.session.request(method, url, json=datas, headers=headers, **kwargs)

            elif method.lower() == 'put':  # 传入修改对象的一个id
                return self.session.request(method, url, json=datas, headers=headers, **kwargs)
            elif method.lower() == 'file':  # 文件上传类型判断
                return self.session.post(url, files=datas, headers=headers, **kwargs)

                # 另外一种实现方式
                # method = 'post'  #
                # return self.session.request(method, url, files=datas, headers=headers, **kwargs)

            elif method.lower() == 'delete':
                return self.session.request(method, url, headers=headers, **kwargs)
            else:
                print('请联系管理员添加该请求方法')

        except Exception as e:
            logger.exception(f"{e}request请求发送错误,请检查。")
            print(f"{e}request请求发送错误,请检查。")

    def close_session(self):
        self.session.close()
